package object2;

/**
 * 面向对象三大特征（封装）
 */
public class Encapsulation {

    public static void main(String[] args) {

        /*
            封装就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起，数据被保护在内部
            程序的其他部分只有通过被授权的操作[方法]，才能对数据进行操作

            隐藏实现细节：方法（连接数据库）<--调用（传入参数...）
            可以对数据进行验证，保证安全合理
            Person {name, age}
            Person p = new Person();
            p.name = "jack";
            p.age = 1200;

            封装实现步骤：
            1)将属性进行私有化 private [不能直接修改属性]
            2)提供一个公共的(public)set方法，用于对属性判断并赋值
                public void setXxx(类型 参数名){
                    //加入数据验证的业务逻辑
                    属性 = 参数名;
                }
            3)提供一个公共的(public)get方法，用于获取属性的值
                public 数据类型 getXxx(){
                    return xx;
                }
         */

        Person person = new Person();
        person.setName("张三");
        person.setAge(30);
        person.setSalary(30000);
        System.out.println(person.info());
        System.out.println(person.getSalary());

        //如果自己使用构造器指定属性
        Person smith = new Person("smith", 130, 50000);
        System.out.println("=======smith信息=======");
        System.out.println(smith.info());

    }
}

class Person {

    public String name;

    private int age;

    private double salary;

    public Person() {
    }

    public void say(int n, String name) {

    }

    //三个属性的构造器
    public Person(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
        //可以将 set 方法写在构造器中，依然可以验证
        setAge(age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //加入数据校验
        if (name.length() >= 2 && name.length() <= 6) {
            this.name = name;
        } else {
            System.out.println("名字的长度不对，需要(2-6)个字符，默认名字");
            this.name = "无名人";
        }
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        //加入数据校验
        if (age >= 1 && age <= 120) {
            this.age = age;
        } else {
            System.out.println("你设置的年龄不对，需要在(1-120)，给默认年龄18");
            this.age = 18;
        }
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public String info() {
        return "信息为 name=" + name + ", age=" + age + ", 薪水=" + salary;
    }
}